package ejb.cbm.admin.facade;

/**
 * @author miguel.arone
 * @version 1.0
 * @created 20-Aug-2011 7:22:36 PM
 */

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import ejb.cbm.admin.bean.ArchivoBean;
import ejb.cbm.admin.bean.ArchivoLayoutBean;
import ejb.cbm.admin.bean.ArchivoLayoutBeanId;
import ejb.cbm.admin.bean.LoteArchivoBean;
import ejb.cbm.admin.entity.ArchivoEntity;
import ejb.cbm.admin.entity.ArchivoLayoutEntity;
import ejb.cbm.admin.entity.ArchivoLayoutEntityId;
import ejb.cbm.admin.entity.LoteArchivoEntity;
import ejb.cbm.admin.local.ArchivoFacadeLocal;
import ejb.cbm.admin.local.ArchivoSessionLocal;
import ejb.cbm.admin.local.LoteArchivoSessionLocal;
import ejb.cbm.commons.BaseRuntimeException;
import ejb.cbm.commons.StackTrace2String;
import ejb.cbm.seguridad.bean.UsuarioBean;

//@Stateless

@Service("archivoFacadeLocal")
public class ArchivoFacade implements ArchivoFacadeLocal {
	
	//@EJB
	public ArchivoSessionLocal archivoSessionLocal;
	
	//@EJB
	public LoteArchivoSessionLocal loteArchivoSessionLocal;
	
	@Autowired
	public void setArchivoSessionLocal(ArchivoSessionLocal archivoSessionLocal) {
		this.archivoSessionLocal = archivoSessionLocal;
	}
	
	@Autowired
	public void setLoteArchivoSessionLocal(LoteArchivoSessionLocal loteArchivoSessionLocal) {
		this.loteArchivoSessionLocal = loteArchivoSessionLocal;
	}
	
	
	public ArchivoFacade() {
		// TODO Auto-generated constructor stub
	}
	
	//@Resource
	//private SessionContext sessionContext;
	
	public ArchivoBean save(ArchivoBean archivoBean, UsuarioBean usuarioLogeado){
		ArchivoEntity entity = null;		
		try{
			if(archivoBean.getCodigoarchivo()==null) {
				entity = new ArchivoEntity();
			} else {
				entity = archivoSessionLocal.findById(archivoBean.getCodigoarchivo());
			}
			entity.setProgramacionTipo(archivoBean.getProgramacionTipo());
			entity.setProgramacionMes(archivoBean.getProgramacionMes());
			entity.setProgramacionDia(archivoBean.getProgramacionDia());
			entity.setProgramacionHora(archivoBean.getProgramacionHora());
			entity.setProgramacionMinuto(archivoBean.getProgramacionMinuto());
			
			//Guardamos los detalles
			List<ArchivoLayoutBean> layoutsBean = archivoBean.getArchivolayoutsBean();
			List<ArchivoLayoutEntity> layoutsEntity = new ArrayList<ArchivoLayoutEntity>();
			
			if(layoutsBean != null) {
				for (ArchivoLayoutBean archivoLayoutBean : layoutsBean) {
					ArchivoLayoutEntity layout = new ArchivoLayoutEntity();
					layout.setArchivo(entity);
					layout.setId(new ArchivoLayoutEntityId(archivoLayoutBean.getId().getCodigoarchivo(),archivoLayoutBean.getId().getPosicion()));
					layout.setCampotabla(archivoLayoutBean.getCampotabla());
					layout.setTipodato(archivoLayoutBean.getTipodato());
					layout.setLongitud(archivoLayoutBean.getLongitud());
					layout.setFormato(archivoLayoutBean.getFormato());
					layout.setFlagactivo(archivoLayoutBean.getFlagactivo());
					layout.setUsuarioregistro(usuarioLogeado.getCodigousuario());
					layout.setFecharegistro(new Date());
					layout.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
					layout.setFechamodificacion(new Date());
					layoutsEntity.add(layout);
				}
			}
			entity.setArchivolayouts(layoutsEntity);
			
			if(archivoBean.getCodigoarchivo()==null) {
				//entity = new ArchivoEntity();
				entity.setCorreoelectronico(archivoBean.getCorreoelectronico());
				entity.setDescripcion(archivoBean.getDescripcion());
				entity.setExtension(archivoBean.getExtension());
				entity.setFechamodificacion(new Date());
				entity.setFecharegistro(new Date());
				entity.setFlagactivo(archivoBean.getFlagactivo());
				entity.setNombrearchivo(archivoBean.getNombrearchivo());
				entity.setRutaentrada(archivoBean.getRutaentrada());
				entity.setRutasalida(archivoBean.getRutasalida());
				entity.setSequence(archivoBean.getSequence());
				entity.setTabla(archivoBean.getTabla());
				entity.setTipoarchivo(archivoBean.getTipoarchivo());
				entity.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
				entity.setUsuarioregistro(usuarioLogeado.getCodigousuario());
				
				entity = archivoSessionLocal.save(entity);
			}else{
				if(archivoBean.getCorreoelectronico()!=null)entity.setCorreoelectronico(archivoBean.getCorreoelectronico());
				if(archivoBean.getDescripcion()!=null)entity.setDescripcion(archivoBean.getDescripcion());
				if(archivoBean.getExtension()!=null)entity.setExtension(archivoBean.getExtension());
				if(archivoBean.getFlagactivo()!=null)entity.setFlagactivo(archivoBean.getFlagactivo());
				if(archivoBean.getNombrearchivo()!=null)entity.setNombrearchivo(archivoBean.getNombrearchivo());
				if(archivoBean.getRutaentrada()!=null)entity.setRutaentrada(archivoBean.getRutaentrada());
				if(archivoBean.getRutasalida()!=null)entity.setRutasalida(archivoBean.getRutasalida());
				if(archivoBean.getSequence()!=null)entity.setSequence(archivoBean.getSequence());
				if(archivoBean.getTabla()!=null)entity.setTabla(archivoBean.getTabla());
				if(archivoBean.getTipoarchivo()!=null)entity.setTipoarchivo(archivoBean.getTipoarchivo());
				entity.setUsuariomodificacion(usuarioLogeado.getCodigousuario());
				entity.setFechamodificacion(new Date());
				
				entity = archivoSessionLocal.update(entity);
			}
			
			BeanUtils.copyProperties(archivoBean, entity);
			
		}catch(RuntimeException e){
			//JdbcHelper.rollback(sessionContext);
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}finally{
			//JdbcHelper.commit(sessionContext);
		}
		
		return archivoBean;
	}
	
	public void eliminar(Long codigoArchivo) throws Exception {
		archivoSessionLocal.delete(codigoArchivo);
	}

	public List<ArchivoBean> buscar(ArchivoBean filtro){
		List<ArchivoEntity> entities = archivoSessionLocal.findByFiltro(filtro);
		List<ArchivoBean> beans = new ArrayList<ArchivoBean>();
		ArchivoBean bean = null;

		try{
			for(ArchivoEntity entity : entities){
				bean = new ArchivoBean();
				BeanUtils.copyProperties(bean, entity);
				beans.add(bean);
			}
		}catch(IllegalAccessException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}catch(InvocationTargetException e){
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return beans;
	}
	
	public ArchivoBean buscar(Long codigoArchivo){
		ArchivoEntity entity = archivoSessionLocal.findById(codigoArchivo);
		ArchivoBean bean = null;

		try{
			bean = new ArchivoBean();
			BeanUtils.copyProperties(bean, entity);
			
			List<ArchivoLayoutEntity> layoutsEnti = entity.getArchivolayouts();
			List<ArchivoLayoutBean> layoutsBean = new ArrayList<ArchivoLayoutBean>();
			
			if (layoutsEnti != null) {
				for (ArchivoLayoutEntity layoutEntity : layoutsEnti) {
					ArchivoLayoutBean layoutBean = new ArchivoLayoutBean();
					layoutBean.setId(new ArchivoLayoutBeanId(layoutEntity.getId().getCodigoarchivo(), layoutEntity.getId().getPosicion()));
					layoutBean.setCampotabla(layoutEntity.getCampotabla());
					layoutBean.setTipodato(layoutEntity.getTipodato());
					layoutBean.setLongitud(layoutEntity.getLongitud());
					layoutBean.setFormato(layoutEntity.getFormato());
					layoutBean.setFlagactivo(layoutEntity.getFlagactivo());
					layoutsBean.add(layoutBean);
				}
			}
			bean.setArchivolayoutsBean(layoutsBean);
		} catch(IllegalAccessException e) {
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		} catch(InvocationTargetException e) {
			throw new BaseRuntimeException(StackTrace2String.stackTraceToString(e));
		}
		
		return bean;
	}


	public void generacionEnvioArchivoHost(long[] codigoArchivo){

	}

	public void enviarCorreoNotficacion(long codigoArchivo){
		
	}

	public String exportarArchivos(long[] archivos){
		return "";
	}
	
	public List<LoteArchivoEntity> buscarLotesGenerados(LoteArchivoBean filtro){
		List<LoteArchivoEntity> entities = loteArchivoSessionLocal.findByFiltro(filtro);
		
		return entities;
	}
}